package com.linyaonan.leetcode.easy._2529;

/**
 * 给你一个按 非递减顺序 排列的数组 nums ，返回正整数数目和负整数数目中的最大值。
 *
 * 换句话讲，如果 nums 中正整数的数目是 pos ，而负整数的数目是 neg ，返回 pos 和 neg二者中的最大值。
 * 注意：0 既不是正整数也不是负整数。
 *
 *
 *
 * 示例 1：
 *
 * 输入：nums = [-2,-1,-1,1,2,3]
 * 输出：3
 * 解释：共有 3 个正整数和 3 个负整数。计数得到的最大值是 3 。
 * 示例 2：
 *
 * 输入：nums = [-3,-2,-1,0,0,1,2]
 * 输出：3
 * 解释：共有 2 个正整数和 3 个负整数。计数得到的最大值是 3 。
 * 示例 3：
 *
 * 输入：nums = [5,20,66,1314]
 * 输出：4
 * 解释：共有 4 个正整数和 0 个负整数。计数得到的最大值是 4 。
 *
 *
 * 提示：
 *
 * 1 <= nums.length <= 2000
 * -2000 <= nums[i] <= 2000
 * nums 按 非递减顺序 排列。
 *
 * @author: Lin
 * @date: 2024/11/26
 */
public class MaximumCountOfPositiveIntegerAndNegativeInteger {

    public int maximumCount(int[] nums) {
        // 1. 找到最大的负数，就可以计算出负数的序列长度
        int f = 0;
        int z = 0;
        {
            int l = 0;
            int r = nums.length - 1;
            int tt = -1;
            while (l <= r) {
                int m = (l + r) >>> 1;
                int temp = nums[m];
                if (temp < 0) {
                    tt = m;
                    l = m + 1;
                } else {
                    r = m - 1;
                }
            }
            if (tt == -1) {
                f = 0;
            } else {
                f = tt + 1;
            }
        }
        // 2. 找到最小的正数，同样计算出正数的序列长度
        {
            int l = 0;
            int r = nums.length - 1;
            int tt = -1;
            while (l <= r) {
                int m = (l + r) >>> 1;
                int temp = nums[m];
                if (temp > 0) {
                    tt = m;
                    r = m - 1;
                } else {
                    l = m + 1;
                }
            }
            if (tt == -1) {
                z = 0;
            } else {
                z = nums.length - 1 - tt + 1;
            }
        }

        return Math.max(f, z);
    }

}
